home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / workbench werkzeuge / bildschirmschoner / blitzblank_2.60 / developer / modulesources / bb.lines.c < prev    next >
C/C++ Source or Header  |  1996-04-07  |  8KB  |  335 lines

  1. #define __USE_SYSBASE 1
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <math.h>
  7. #include <dos.h>
  8. #include <dos/dos.h>
  9. #include <exec/memory.h>
  10. #include <intuition/intuitionbase.h>
  11. #include <intuition/screens.h>
  12. #include <intuition/intuition.h>
  13. #include <devices/timer.h>
  14. #include <proto/exec.h>
  15. #include <proto/intuition.h>
  16. #include <proto/graphics.h>
  17. #include <clib/alib_protos.h>
  18. #include <pragmas/blitzblank_pragmas.h>
  19.  
  20. #include <BlitzBlank.h>
  21.  
  22. struct Library *BlitzBlankBase;
  23. static const char version[]="$VER: BB.Lines 2.60 (22.04.95)";
  24.  
  25. char *text[]={"\33c\33uLines\33n\n\nModule for BlitzBlank\n\nCopyright 1995\nby\nThomas Börkel",
  26.               "_Lines:",
  27.               "_Delay:"};
  28.  
  29. struct BB_Object object[]={ {&object[1],BB_VGroup,0,0,0,NULL,NULL},
  30.                             {&object[2],BB_Slider,5,200,50,NULL,NULL},
  31.                             {&object[3],BB_Slider,0,500,0,NULL,NULL},
  32.                             {NULL      ,BB_VGroup_End,0,0,0,NULL,NULL} };
  33.  
  34. struct line
  35. {
  36.   int x1;
  37.   int y1;
  38.   int x2;
  39.   int y2;
  40.   int c;
  41. };
  42.  
  43.  
  44. struct BB_Message message;
  45. struct BB_Screeninfo *screeninfo;
  46. struct RastPort *rp;
  47. struct line *li;
  48. int dx1,dy1,dx2,dy2;
  49.  
  50.  
  51. struct timerequest* inittimer (struct MsgPort *timerport)
  52. {
  53.   struct timerequest *timerio;
  54.   if ((timerio=CreateIORequest (timerport,sizeof (struct timerequest))))
  55.     if (!(OpenDevice ("timer.device",UNIT_MICROHZ,(struct IORequest *) timerio,0)))
  56.       timerio->tr_node.io_Command=TR_ADDREQUEST;
  57.   return (timerio);
  58. }
  59.  
  60.  
  61. void waittimer (struct timerequest *timerio,int sec,int mic)
  62. {
  63.   if (timerio)
  64.   {
  65.     timerio->tr_time.tv_secs=sec;
  66.     timerio->tr_time.tv_micro=mic;
  67.     DoIO ((struct IORequest *) timerio);
  68.   }
  69.   return;
  70. }
  71.  
  72.  
  73. /* may only be called, if starttimer() was called before */
  74. void stoptimer (struct timerequest *timerio)
  75. {
  76.   if (timerio)
  77.   {
  78.     AbortIO ((struct IORequest *) timerio);
  79.     WaitIO ((struct IORequest * ) timerio);
  80.   }
  81.   return;
  82. }
  83.  
  84.  
  85. /* may only be called, if no timerequest is pending */
  86. void deletetimer (struct timerequest *timerio)
  87. {
  88.   if (timerio)
  89.   {
  90.     CloseDevice ((struct IORequest *) timerio);
  91.     DeleteIORequest ((struct IORequest *) timerio);
  92.   }
  93.   return;
  94. }
  95.  
  96.  
  97. int sgn (long a)
  98. {
  99.   if (a<0)
  100.     return (-1);
  101.   if (a>0)
  102.     return (1);
  103.   return (0);
  104. }
  105.  
  106.  
  107. void check (int i)
  108. {
  109.   if (li[i].x1>screeninfo->width-1 || li[i].x1<0)
  110.   {
  111.     dx1=-dx1;
  112.     li[i].x1+=2*dx1;
  113.   }
  114.   if (li[i].y1>screeninfo->height-1 || li[i].y1<0)
  115.   {
  116.     dy1=-dy1;
  117.     li[i].y1+=2*dy1;
  118.   }
  119.   if (li[i].x2>screeninfo->width-1 || li[i].x2<0)
  120.   {
  121.     dx2=-dx2;
  122.     li[i].x2+=2*dx2;
  123.   }
  124.   if (li[i].y2>screeninfo->height-1 || li[i].y2<0)
  125.   {
  126.     dy2=-dy2;
  127.     li[i].y2+=2*dy2;
  128.   }
  129.   return;
  130. }
  131.  
  132.  
  133. void blank (void)
  134. {
  135.   int i,colors,al,w=3,s=1,co=1,ch,stop=FALSE,v;
  136. //  struct ViewPort *vp;
  137.   struct DateStamp ds;
  138.   struct MsgPort *timerport;
  139.   struct timerequest *timerio;
  140.  
  141.   al=object[1].set;
  142.  
  143.   if (!(li=calloc (al+1,sizeof (struct line)))) return;
  144.  
  145.   if ((timerport=CreateMsgPort ()))
  146.   {
  147.     if ((timerio=inittimer (timerport)))
  148.     {
  149.  
  150.  
  151.       colors=1<<screeninfo->depth;
  152.       rp=&screeninfo->bbscreen->RastPort;
  153.     //  vp=&screeninfo->bbscreen->ViewPort;
  154.  
  155.       DateStamp (&ds);
  156.       srand48 (ds.ds_Minute*60+ds.ds_Tick);
  157.     /*
  158.       SetRGB4 (vp,0,0,0,0);
  159.       SetRGB4 (vp,1,15,0,0);
  160.       if (colors>2)
  161.       {
  162.         SetRGB4 (vp,2,0,0,15);
  163.         SetRGB4 (vp,3,0,15,0);
  164.         if (colors>4)
  165.         {
  166.           SetRGB4 (vp,4,0,5,0);
  167.           SetRGB4 (vp,5,15,3,8);
  168.           SetRGB4 (vp,6,15,5,15);
  169.           SetRGB4 (vp,7,5,15,8);
  170.           if (colors>8)
  171.           {
  172.             SetRGB4 (vp,8,10,5,0);
  173.             SetRGB4 (vp,9,0,15,5);
  174.             SetRGB4 (vp,10,15,7,15);
  175.             SetRGB4 (vp,11,0,7,15);
  176.             SetRGB4 (vp,12,8,15,3);
  177.             SetRGB4 (vp,13,15,10,5);
  178.             SetRGB4 (vp,14,7,0,15);
  179.             SetRGB4 (vp,15,3,8,15);
  180.             if (colors>16)
  181.               for (i=16;i<colors;i++)
  182.                 SetRGB4 (vp,i,(long) (drand48 ()*13+3),(long) (drand48 ()*13+3),(long) (drand48 ()*13+3));
  183.           }
  184.         }
  185.       }
  186.     */
  187.  
  188.       BBL_RainbowPalette (screeninfo->bbscreen,1,colors-1);
  189.  
  190.       ch=al/colors;
  191.       if (ch==0)
  192.         ch=1;
  193.  
  194.       dx1=drand48 ()*w+s;
  195.       dy1=drand48 ()*w+s;
  196.       dx2=drand48 ()*w+s;
  197.       dy2=drand48 ()*w+s;
  198.  
  199.       li[0].x1=drand48 ()*screeninfo->width;
  200.       li[0].y1=drand48 ()*screeninfo->height;
  201.       li[0].x2=drand48 ()*screeninfo->width;
  202.       li[0].y2=drand48 ()*screeninfo->height;
  203.  
  204.       ScreenToFront (screeninfo->bbscreen);
  205.  
  206.     /*
  207.       for (i=0;i<colors;i++)
  208.       {
  209.         SetAPen (rp,i);
  210.         Move (rp,i,0);
  211.         Draw (rp,i,100);
  212.       }
  213.  
  214.       Delay (200);
  215.     */
  216.  
  217.       if (!CheckSignal (SIGBREAKF_CTRL_C))
  218.       {
  219.         BBL_ModuleRunning ();
  220.  
  221.         for (i=1;i<al;i++)
  222.         {
  223.     //      if (object[2].set)
  224.     //        TimeDelay (UNIT_MICROHZ,0,object[2].set*100);
  225.           if (object[2].set)
  226.             waittimer (timerio,0,object[2].set*100);
  227.           li[i].x1=li[i-1].x1+dx1;
  228.           li[i].y1=li[i-1].y1+dy1;
  229.           li[i].x2=li[i-1].x2+dx2;
  230.           li[i].y2=li[i-1].y2+dy2;
  231.           check (i);
  232.           if (i%ch==0)
  233.           {
  234.             co++;
  235.             if (co>colors-1)
  236.               co=1;
  237.           }
  238.           SetAPen (rp,co);
  239.           Move (rp,li[i].x1,li[i].y1);
  240.           Draw (rp,li[i].x2,li[i].y2);
  241.           if (CheckSignal (SIGBREAKF_CTRL_C))
  242.           {
  243.             i=al-1;
  244.             stop=TRUE;
  245.           }
  246.         }
  247.  
  248.         if (!stop && !CheckSignal (SIGBREAKF_CTRL_C))
  249.         {
  250.           i=0;
  251.           v=al-1;
  252.           do
  253.           {
  254.     //        if (object[2].set)
  255.     //          TimeDelay (UNIT_MICROHZ,0,object[2].set*100);
  256.             if (object[2].set)
  257.               waittimer (timerio,0,object[2].set*100);
  258.             SetAPen (rp,0);
  259.             Move (rp,li[i].x1,li[i].y1);
  260.             Draw (rp,li[i].x2,li[i].y2);
  261.             li[i].x1=li[v].x1+dx1;
  262.             li[i].y1=li[v].y1+dy1;
  263.             li[i].x2=li[v].x2+dx2;
  264.             li[i].y2=li[v].y2+dy2;
  265.             check (i);
  266.             if (i%ch==0)
  267.             {
  268.               co++;
  269.               if (co>colors-1)
  270.                 co=1;
  271.             }
  272.             SetAPen (rp,co);
  273.             Move (rp,li[i].x1,li[i].y1);
  274.             Draw (rp,li[i].x2,li[i].y2);
  275.             i++;
  276.             if (i>al-1)
  277.             {
  278.               i=0;
  279.               dx1=sgn(dx1)*(drand48 ()*w+s);
  280.               dy1=sgn(dy1)*(drand48 ()*w+s);
  281.               dx2=sgn(dx2)*(drand48 ()*w+s);
  282.               dy2=sgn(dy2)*(drand48 ()*w+s);
  283.             }
  284.             v++;
  285.             if (v>al-1)
  286.               v=0;
  287.           } while (!CheckSignal (SIGBREAKF_CTRL_C));
  288.         }
  289.       }
  290.       deletetimer (timerio);
  291.     }
  292.     DeleteMsgPort (timerport);
  293.   }
  294.   return;
  295. }
  296.  
  297.  
  298. void main(int argc,char **argv)
  299. {
  300.  
  301.   if (!(BlitzBlankBase=OpenLibrary ("blitzblank.library",BLITZBLANKLIB_VER)))
  302.     exit (0);
  303.  
  304.   message.flags=BBF_Screenmode|BBF_Colors;
  305.   message.first=&object[0];
  306.   StrToLong (argv[3],(long *) &screeninfo);
  307.   screeninfo->maxdepth=8;
  308.  
  309.   if (strcmp (argv[1],"BLANK")==0)
  310.   {
  311.     BBL_SendMessage (&message,argv[2]);
  312.     if (screeninfo->bbscreen)
  313.       blank ();
  314.     BBL_BlankDone ();
  315.   }
  316.   else
  317.   {
  318.     message.infotext=BBL_GetString (270,text[0]);
  319.     object[1].label=BBL_GetString (271,text[1]);
  320.     object[2].label=BBL_GetString (272,text[2]);
  321.     if (strcmp (argv[1],"CONFIG")==0)
  322.     {
  323.       BBL_SendMessage (&message,argv[2]);
  324.     }
  325.     else
  326.     {
  327.       message.first=NULL;
  328.       BBL_SendMessage (&message,argv[2]);
  329.     }
  330.   }
  331.   CloseLibrary (BlitzBlankBase);
  332.   exit (0);
  333. }
  334.  
  335.